package com.xuyuan.jdk.test;

/**
 * 堆栈丢失问题分析
 *
 * @author xuyuan
 * @desc 之所以会有这样的运行结果，是因为Java有JIT的编译机制。
 * 为了实现WORA (Write once, run anywhere)Java会先将源代码编译成字节码，然后在运行时再转换为机器码，
 * 虽然提升了通用性，但是字节码转换为机器码的速度会直接影响到整个Java程序的运行速度，
 * 因此JVM在实现的时候会将一些热点代码直接编译成Native Code，运行时省去了从字节码转化这一步，以此达到提升性能的目的，
 * 被多次调用的方法，被多次调用的循环体会被判定为热点代码，从而直接编译为Native Code，因此丢失了堆栈。
 */
public class DemoApplication {

    public static void main(String[] args) {
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            System.out.println("times:" + i + " , result:" + testExceptionTrunc());
        }
    }

    public static boolean testExceptionTrunc() {
        try {
            // 人工构造异常抛出的场景
            ((Object) null).getClass();
        } catch (Exception e) {
            if (e.getStackTrace().length == 0) {
                try {
                    // 堆栈消失的时候当前线程休眠5秒，便于观察
                    Thread.sleep(5000);
                } catch (InterruptedException interruptedException) {
                    // do nothing
                }
                return true;
            }
        }
        return false;
    }
}